import { handlerEvents } from './controllers/handlerEvents'
import { saveOptions } from './controllers/options'
import { setFlag, getFlag } from './utils/global'
import { setupEvents } from './controllers/setupEvents/index'
// 全局初始化配置
function initConfig(options) {

    // 上报地址与appkey
    if (!options.dsn || !options.apikey) {
        console.error('you-see插件缺少配置项' + !options.dsn ? 'dsn' : 'appKey');
        return
    }
    if (options.disabled) {
        return
    }

    // 初始化配置项
    saveOptions(options)
    // 非vue 或  react  监听到的错误信息
    setupEvents()
}


/**
 * @func vue错误采集
 * @msg  vue 通过 Vue.config.errorHander 来捕获异常
 * @params: vue,options
 * 
*/

function install(Vue, options) {
    if (!getFlag('vue')) {
        setFlag('vue', true);
        const handler = Vue.config.errorHandler;
        /**
         * 指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时，可获取错误信息和 Vue 实例。
            会捕获组件生命周期钩子里的错误。同样的，当这个钩子是 undefined 时，被捕获的错误会通过 console.error 输出而避免应用崩溃。
            会捕获 Vue 自定义事件处理函数内部的错误了。
            会捕获 v-on DOM 监听器内部抛出的错误。另外，如果任何被覆盖的钩子或处理函数返回一个 Promise 链 (例如 async 函数)，则来自其 Promise 链的错误也会被处理。
         *  */
        Vue.config.errorHandler = function (err, vm, info) {
            handlerEvents.collectError(err)
            if (handler) handler.apply(null, [err, vm, info]);
        }
        initConfig(options)
    }
}
function reactErrorBoundary(err) {
    // TODO 消息订阅中心处理错误分发
}
function use(plugin, options) {
    let instance = new plugin(options)
    try {
        instance.bindCore()
    } catch (error) {

    }

}
export default {
    install,
    reactErrorBoundary
}